#include "regmod_usuarios.h"
#include "ui_regmod_usuarios.h"
#include "Departamentos/regmod_departamento.h"
#include "Sucursales/regmod_sucursal.h"
#include <QDjangoQuerySet.h>
#include <QDjangoWhere.h>
#include <QtSql>
#include <QMessageBox>
#define ADMINISTRADOR "Administrador"
#define RECEPCIONISTA "Recepcionista"
#define FLEBOTOMISTA "Flebotomista"
#define BIOQUIMICO "Bioquimico"
#define ACTIVO "activo"
#define INACTIVO "inactivo"

RegMod_Usuarios::RegMod_Usuarios(QWidget *parent, Usuario *usu) :
    QDialog(parent),
    ui(new Ui::RegMod_Usuarios)
{
    ui->setupUi(this);

    this->setWindowFlags(Qt::Tool);
    this->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, this->size(), qApp->desktop()->availableGeometry()));

    //***Se cargan los comboBox***
    this->setWindowTitle("Registrar Usuario");

    ui->cargoComboBox->addItem("");
    ui->cargoComboBox->addItem(ADMINISTRADOR);
    ui->cargoComboBox->addItem(RECEPCIONISTA);
    ui->cargoComboBox->addItem(FLEBOTOMISTA);
    ui->cargoComboBox->addItem(BIOQUIMICO);
    ui->idLineEdit->setVisible(false);

    QDjangoQuerySet<Departamento> departamentos;
    int c = departamentos.count();
    qDebug() << QString::number(c);
    if(departamentos.at(0) != NULL)
    {
        ui->departamentoComboBox->addItem("");
        foreach(const Departamento &depto, departamentos)
        {
            ui->departamentoComboBox->addItem(depto.getNombre_departamento());
        }
    }

    //***validación de los campos***
    validatorNum = new QIntValidator(1, 99999999);
    ui->cedulaLineEdit->setValidator(validatorNum);
    ui->contrasenhaLineEdit->setEchoMode(QLineEdit::Password);
    validatorString = new QRegExpValidator(QRegExp("[^0-9]{50}"),this);
    ui->nombreLineEdit->setValidator(validatorString);
    ui->apellidoLineEdit->setValidator(validatorString);
    esModificacion = false;

    //***Modificar Usuario***
    if(usu != NULL)
    {
        esModificacion = true;
        this->setWindowTitle("Editar Usuario");
        ui->idLineEdit->setText(QString::number(usu->getId_usuario()));
        ui->cedulaLineEdit->setText(QString::number(usu->getCedula()));
        ui->nombreLineEdit->setText(usu->getNombre());
        ui->apellidoLineEdit->setText(usu->getApellido());
        ui->cargoComboBox->setCurrentText(usu->getCargo());
        ui->direccionLineEdit->setText(usu->getDireccion());
        ui->telefonoLineEdit->setText(usu->getTelefono());
        ui->correoLineEdit->setText(usu->getCorreo());
        ui->usuarioLineEdit->setText(usu->getNick());
        ui->contrasenhaLineEdit->setText(usu->getPassword());
        if(usu->getPassword_temporal())
        {
            ui->temporalCheckBox->setChecked(true);
        }
        else
        {
            ui->temporalCheckBox->setChecked(false);
        }
        ui->departamentoComboBox->setCurrentText(usu->getDepartamento()->getNombre_departamento());
        ui->aceptarPushButton->setFocus();
        usu->deleteLater();
    }
    else
    {
        ui->telefonoLineEdit->setInputMask("999#-999-999");
        this->setWindowTitle("Nuevo Usuario");
    }
}

RegMod_Usuarios::~RegMod_Usuarios()
{
    delete ui;
}

void RegMod_Usuarios::on_aceptarPushButton_clicked()
{
    QDjango::setDebugEnabled(true);
    //***Si no existen campos vacíos y cumplen con las validaciones se inserta en la tabla,
    //sino se emite el mensaje correspondiente***
    if( (ui->nombreLineEdit->text().simplified() == "") || (ui->apellidoLineEdit->text().simplified() == "")
            || (ui->cargoComboBox->currentText().simplified() == "") || (ui->usuarioLineEdit->text().simplified() == "")
            || (ui->contrasenhaLineEdit->text().simplified() == "")  || (ui->departamentoComboBox->currentText().simplified() == "")
            || (!ui->correoLineEdit->text().isEmpty() && (!emailEsValido(ui->correoLineEdit->text()))) || (!telefonoEsValido(ui->telefonoLineEdit->text())))
    {

        if(ui->nombreLineEdit->text().simplified() == "")
        {
            ui->nombreLineEdit->setFocus();
            QToolTip::showText(ui->nombreLineEdit->mapToGlobal(QPoint(10,8)), "Campo Obligatorio");
        }
        else
            if(ui->apellidoLineEdit->text().simplified() == "")
            {
                ui->apellidoLineEdit->setFocus();
                QToolTip::showText(ui->apellidoLineEdit->mapToGlobal(QPoint(10,8)), "Campo Obligatorio");
            }
            else
                if(ui->cargoComboBox->currentText().simplified() == "")
                {
                    ui->cargoComboBox->setFocus();
                    QToolTip::showText(ui->cargoComboBox->mapToGlobal(QPoint(10,8)), "Campo Obligatorio");
                }
                else
                    if(ui->usuarioLineEdit->text().simplified() == "")
                    {
                        ui->usuarioLineEdit->setFocus();
                        QToolTip::showText(ui->usuarioLineEdit->mapToGlobal(QPoint(10,8)), "Campo Obligatorio");
                    }
                    else
                        if(ui->contrasenhaLineEdit->text().simplified() == "")
                        {
                            ui->contrasenhaLineEdit->setFocus();
                            QToolTip::showText(ui->contrasenhaLineEdit->mapToGlobal(QPoint(10,8)), "Campo Obligatorio");
                        }
                        else
                            if(ui->departamentoComboBox->currentText().simplified() == "")
                            {
                                ui->departamentoComboBox->setFocus();
                                QToolTip::showText(ui->departamentoComboBox->mapToGlobal(QPoint(10,8)), "Campo Obligatorio");
                            }
                            else
                                if(!ui->correoLineEdit->text().simplified().isEmpty() && (!emailEsValido(ui->correoLineEdit->text().simplified())))
                                {
                                    ui->correoLineEdit->setFocus();
                                    QToolTip::showText(ui->correoLineEdit->mapToGlobal(QPoint(10,8)), "Verifique el correo");
                                }
                                else
                                    if(!telefonoEsValido(ui->telefonoLineEdit->text().simplified()))
                                    {
                                        ui->telefonoLineEdit->setFocus();
                                        QToolTip::showText(ui->telefonoLineEdit->mapToGlobal(QPoint(10,8)), "Verifique el teléfono");
                                    }
    }
    else
    {
        QDjangoQuerySet<Usuario> usus;
        Usuario *us = new Usuario();
        if(!esModificacion && existeEnLaBD("usuario", "nick", ui->usuarioLineEdit->text().simplified()))
        {
            us = usus.filter(QDjangoWhere("nick", QDjangoWhere::Equals, ui->usuarioLineEdit->text())).at(0);

            if(us->getEstado() == INACTIVO)
            {
                int resp = cuadroMensaje("", "El usuario se encuentra como inactivo en la base de datos\nDesea volver a ponerlo activo?", "pregunta");
                if(resp == QMessageBox::Ok)
                {
                    us->setEstado(ACTIVO);
                    us->save();
                    this->close();
                }
            }
            else
            {
                cuadroMensaje("Error en el Registro", "Ya se encuentra registrado el nombre de usuario", "error");
            }
            delete us;
        }
        else if(!esModificacion && existeEnLaBD("usuario", "cedula", ui->cedulaLineEdit->text().simplified()))
        {
            us = usus.filter(QDjangoWhere("cedula", QDjangoWhere::Equals, ui->cedulaLineEdit->text())).at(0);

            if(us->getEstado() == INACTIVO)
            {
                int resp = cuadroMensaje("", "El usuario se encuentra como inactivo en la base de datos\nDesea volver a ponerlo activo?", "pregunta");
                if(resp == QMessageBox::Ok)
                {
                    us->setEstado(ACTIVO);
                    us->save();
                    this->close();
                }
            }
            else
            {
                cuadroMensaje("Error en el Registro", "Ya se encuentra registrado la cédula de usuario", "error");
            }
            delete us;
        }
        else
        {

            Departamento *departamento = new Departamento();

            QDjangoQuerySet<Departamento> departamentos;
            if (departamentos.count() != 0)
            {
                departamentos = departamentos.filter(QDjangoWhere("nombre_departamento", QDjangoWhere::Equals, ui->departamentoComboBox->currentText()));
                departamento = departamentos.at(0);
            }

            Usuario *usuario = new Usuario();
            // Si el lineEdit de Id NO se encuentra vacío, es decir, si es una modificación..
            if (!ui->idLineEdit->text().isEmpty())
            {
                usuario->setId_usuario(ui->idLineEdit->text().simplified().toInt());
            }
            // Si el idLineEdit está vacío, es decir, es una inserción nueva.
            else
            {
                QSqlQuery query;
                // Se obtiene el máximo id y Si no existe registro en la tabla el primer id se establece en cero para luego incrementar de a uno.
                query.exec("select coalesce(max(id_usuario),0) from usuario");
                int maxId;
                while (query.next())
                {
                    maxId = query.value(0).toInt();
                }
                usuario->setId_usuario(maxId + 1);
            }
            usuario->setEstado(ACTIVO);
            usuario->setCedula(ui->cedulaLineEdit->text().simplified().toInt());
            usuario->setNombre(ui->nombreLineEdit->text().simplified());
            usuario->setApellido(ui->apellidoLineEdit->text().simplified());
            usuario->setDireccion(ui->direccionLineEdit->text().simplified());
            usuario->setTelefono(ui->telefonoLineEdit->text().simplified());
            usuario->setCargo(ui->cargoComboBox->currentText().simplified());
            usuario->setNick(ui->usuarioLineEdit->text().simplified());
            usuario->setPassword(ui->contrasenhaLineEdit->text().simplified());
            if(ui->temporalCheckBox->isChecked())
            {
                usuario->setPassword_temporal(true);
            }
            else
            {
                usuario->setPassword_temporal(false);
            }
            usuario->setDepartamento(departamento);
            usuario->setCorreo(ui->correoLineEdit->text().simplified());
            usuario->save();
            delete usuario;
            this->close();
        }
    }
}



void RegMod_Usuarios::on_cancelarPushButton_clicked()
{
    this->close();
}

void RegMod_Usuarios::on_addDeptoPushButton_clicked()
{
    //Se abre ventana de registro de departamentos.
    regmod_departamento *depto = new regmod_departamento();
    depto->exec();
    delete depto;

    //Se refresca el comboBox de departamentos.
    QDjangoQuerySet<Departamento> departamentos;
    if(departamentos.count() != ui->departamentoComboBox->count() - 1)
    {
        ui->departamentoComboBox->addItem(departamentos.at(departamentos.count()-1)->getNombre_departamento());
    }
}

#undef ADMINISTRADOR
#undef RECEPCIONISTA
#undef FLEBOTOMISTA
#undef BIOQUIMICO
#undef ACTIVO
#undef INACTIVO
